Create a Custom Response (Resource)
In Beauty Framework, you can create structured and reusable response classes by extending AbstractJsonResource
. These are helpful when returning data from your API — such as users, profiles, or any other resource.
A resource implements ResponsibleInterface
and can be returned directly from a controller. Internally, it will be converted into a proper JsonResponse
.
✨ Example: UserResponse
namespace App\Responses\User;
use Beauty\Http\Response\AbstractJsonResource;
class UserResponse extends AbstractJsonResource
{
protected array $fields = ['id', 'name', 'email'];
public function __construct(
public int $id,
public string $name,
public string $email,
) {}
// Optional, AbstractJsonResource will auto generate serialized data
public function jsonSerialize(): array
{
return [
'id' => $this->id,
'name' => $this->name,
'email' => $this->email,
];
}
}
This class is used to format the output structure of a single user.
✅ Usage in Controller
use Beauty\Http\Response\Contracts\ResponsibleInterface;
#[Route(HttpMethodsEnum::GET, '/users')]
public function index(HttpRequest $request): ResponseInterface
{
// Example array of User entities
return new JsonResponse(200, [
'users' => array_map(fn (User $user) => new UserResponse(
$user->getId(),
$user->getName(),
$user->getEmail(),
), $users),
]);
}
#[Route(HttpMethodsEnum::POST, '/user')]
public function store(CreateUserRequest $request): ResponsibleInterface
{
$data = $request->json();
// Example array of User entities
return new UserResponse(
$data->getId(),
$data->getName(),
$user->getEmail(),
);
}
🔧 Custom Headers and Status Codes
You can configure headers or status code fluently:
return (new UserResponse(...))
->setStatusCode(201)
->setHeader('X-Custom-Header', 'Value');
💡 Notes
- This approach makes it easy to reuse response formats across multiple controllers
jsonSerialize()
gives you full control over output structure- You can also return
AbstractJsonResource
directly if your controller allowsResponsibleInterface
return types
Resource responses help separate transformation logic from business logic — keeping your controllers clean and predictable.